/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package foundation;

import entity.xml.EMessaggio;
import entity.xml.EUtente;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import org.jaxen.BaseXPath;
import org.jaxen.JaxenException;
import org.jaxen.Navigator;
import org.jaxen.XPath;
import org.jaxen.dom.DOMXPath;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

/**
 *
 * @author Quirino
 */

public class FMessaggi {
    
    private static FMessaggi istance=null;
    private SAXBuilder builder;
    private String urlDoc;
    private Document doc;
    private XMLOutputter outp;
    private ArrayList<EMessaggio> messageList;
    
    
    private FMessaggi(){
        
        this.builder= new SAXBuilder();
        this.outp= new XMLOutputter();
        this.urlDoc= "src/database/messaggi.xml";
        
    }
    
    public static FMessaggi getIstance(){
        
        if(istance==null) istance= new FMessaggi();
        return istance;
        
    }
    
    public boolean insertMessage(EMessaggio em) throws JDOMException, IOException{
    
        boolean flag= false; 
        
        this.getMessageList();

        this.doc= this.builder.build(this.urlDoc);
        
        Element root= doc.getRootElement();
        
        Element messaggio= new Element("messaggio");
        
        Element id= new Element("id");
        id.setText(Integer.toString(em.getID()));
        messaggio.addContent(id);
        
        Element contenuto= new Element("contenuto");
        contenuto.setText(em.getContenuto());
        messaggio.addContent(contenuto);
        
        Element mittente= new Element("mittente");
        mittente.setText(Integer.toString(em.getMittente().getID()));
        messaggio.addContent(mittente);
        
        //SI DEVE INSERIRE UN ARRAY LIST DI UTENTI, NELLA STRUTTURA XML <destinatario><idDestinatario></idDestinatario></destinatari>
        Element destinatario= new Element("destinatario");
        for(int i=0; i<em.getDestinatario().size(); i++){
            Element idDest= new Element("idDestinatario");
            idDest.setText(Integer.toString(em.getDestinatario().get(i).getID()));
            destinatario.addContent(idDest);
        }
        messaggio.addContent(destinatario);
        //destinatario.setText(Integer.toString(em.getDestinatario().getID()));
        
        
        SimpleDateFormat formatDate = new SimpleDateFormat("yyyy-MM-dd");
        String dateFormatted = formatDate.format(em.getData().getTime());
        Element data= new Element("data");
        data.setText(dateFormatted);
        messaggio.addContent(data);
        
        Element stato= new Element("stato");
        stato.setText(Integer.toString(em.getStato()));
        messaggio.addContent(stato);
        
        Element idConversazione= new Element("idConversazione");
        idConversazione.setText(Integer.toString(em.getIDConversazione()));
        messaggio.addContent(idConversazione);
        
        root.addContent(messaggio);
        
        String des = new XMLOutputter().outputString(this.doc);
        FileWriter fileWriter = new FileWriter(new File(this.urlDoc));
        fileWriter.write(des);
        fileWriter.close();
        
        this.messageList.add(em);
        
        flag= true;
        
        return flag;
        
    }
    
    public ArrayList<EMessaggio> getMessageList() throws JDOMException, IOException{
        
        this.messageList= new ArrayList<EMessaggio>();
        
        this.doc= this.builder.build(this.urlDoc);
        
        Element root = doc.getRootElement();
        List allMessages= root.getChildren();
        
        for(int i=0; i<allMessages.size(); i++){
            
            Element msg= (Element)allMessages.get(i);
            
            EMessaggio emsg= new EMessaggio();
            
            Element idMsg= msg.getChild("id");
            emsg.setID(Integer.parseInt(idMsg.getText()));
            
            Element contenutoMsg= msg.getChild("contenuto");
            emsg.setContenuto(contenutoMsg.getText());
            
            Element mittenteMsg= msg.getChild("mittente");
            int idMitt= Integer.parseInt(mittenteMsg.getText());
            emsg.setMittente(FUtenti.getIstance().getUserByID(idMitt));
            
            
            // si deve settare un array list di destinatari, come fatto per la rubrica in FUtenti
            // ora la struttura xml è: <destinatario><idDestinatario></idDestinatario><idDestinatario></idDestinatario>..</destinatario>
            Element destinatarioMsg= msg.getChild("destinatario");
            List<Element> lisDestinatario= destinatarioMsg.getChildren();
            for(int j=0; j<lisDestinatario.size(); j++){
                
                Element contattoRubrica= lisDestinatario.get(j);
                int idDestinatario= Integer.parseInt(contattoRubrica.getText());
                emsg.getDestinatario().add(FUtenti.getIstance().getUserByID(idDestinatario));
                
            }
            /*
            int idDest= Integer.parseInt(destinatarioMsg.getText());
            emsg.setDestinatario(FUtenti.getIstance().getUserByID(idDest));
            */
            
            
            Element dataMsg= msg.getChild("data");
            emsg.setData(FUtility.getDateByXML(dataMsg.getText()));
            
            Element statoMsg= msg.getChild("stato");
            emsg.setStato(Integer.parseInt(statoMsg.getText()));
            
            Element idConversazioneMsg= msg.getChild("idConversazione");
            emsg.setIDConversazione(Integer.parseInt(idConversazioneMsg.getText()));
            
            this.messageList.add(emsg);
            
        }
        
        return this.messageList;
        
    }
    
    public void printMsgList(){
        
       /* System.out.println("=============================   LISTA DEI MESSAGGI  =============================");
        for(int i=0; i<this.messageList.size(); i++){
            
            EMessaggio em= (EMessaggio)this.messageList.get(i);
            em.printMsg();
            
        }
        System.out.println("=================================================================================");*/
    }
    
    public ArrayList<EMessaggio> getMsgBySender(EUtente eu){
        
        ArrayList<EMessaggio> lisMsgBySent= new ArrayList<EMessaggio>();
        try {
            this.getMessageList();
        } catch (JDOMException ex) {
            Logger.getLogger(FMessaggi.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(FMessaggi.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        for(int i=0; i<this.messageList.size(); i++){
            
            if(this.messageList.get(i).getMittente().getID()==eu.getID()){
            
                lisMsgBySent.add(this.messageList.get(i));
                
            }
            
        }
        
        return lisMsgBySent;
        
    } 
    
    public ArrayList<EMessaggio> getMsgByReceiver(EUtente eu){
        
        ArrayList<EMessaggio> lisMsgByRec= new ArrayList<EMessaggio>();
        try {
            this.getMessageList();
        } catch (JDOMException ex) {
            Logger.getLogger(FMessaggi.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(FMessaggi.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        for(int i=0; i<this.messageList.size(); i++){
            
            // SI DEVE CONTROLLARE SE UNO TRA I DESTINATARI DELL'ARRAY LIST HA L ID CHE SI STA CONSIDERANDO
            for(int j=0; j<this.messageList.get(i).getDestinatario().size(); j++){
                
                if(this.messageList.get(i).getDestinatario().get(j).getID()==eu.getID()){
            
                    lisMsgByRec.add(this.messageList.get(i));

                }
                
            }
            
        }
        
        return lisMsgByRec;
        
    } 
    
    public ArrayList<EMessaggio> getMsgBySenderAndReceiver(EUtente sender, EUtente receiver){
        
        ArrayList<EMessaggio> lisMsgBySenderAndReceiver= new ArrayList<EMessaggio>();
        try {
            this.getMessageList();
        } catch (JDOMException ex) {
            Logger.getLogger(FMessaggi.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(FMessaggi.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        for(int i=0; i<this.messageList.size(); i++){
            
            for(int j=0; j<this.messageList.get(i).getDestinatario().size(); j++){
            
                if(
                        (this.messageList.get(i).getDestinatario().get(j).getID()==sender.getID() &&
                            this.messageList.get(i).getMittente().getID()==receiver.getID() ) || 
                        (this.messageList.get(i).getDestinatario().get(j).getID()==receiver.getID() &&
                            this.messageList.get(i).getMittente().getID()==sender.getID() )

                ){

                    lisMsgBySenderAndReceiver.add(this.messageList.get(i));

                }
            
            }
            
        }
        
        return lisMsgBySenderAndReceiver;
        
    }
    
    public EMessaggio getMsgByID(int msgID){
      
        EMessaggio em= new EMessaggio();
        
        for(int i=0; i<this.messageList.size(); i++){
            
            if(((EMessaggio)this.messageList.get(i)).getID()==msgID) em= (EMessaggio)this.messageList.get(i);
            
        }
        
        return em;
        
    }
    
    public int getNextID(){
        
        int maxID= 0;
        
        try {
            this.getMessageList();
        } catch (JDOMException ex) {
            Logger.getLogger(FMessaggi.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(FMessaggi.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        for(int i=0; i<this.messageList.size(); i++){
            
            if(((EMessaggio)this.messageList.get(i)).getID()>maxID) maxID= ((EMessaggio)this.messageList.get(i)).getID();
            
        }
        
        return (maxID+1);
        
    }
    
    
    public int getNextIDConversation(EUtente mittente, ArrayList<EUtente> destinatari){
        
        int maxIDConversation= 0;
        
        for(int i=0; i<this.messageList.size(); i++){

            if(destinatari.equals((ArrayList<EUtente>)this.messageList.get(i).getDestinatario()) && 
                    mittente.equals((EUtente)this.messageList.get(i).getMittente())){
                
                if(this.messageList.get(i).getIDConversazione()>maxIDConversation) maxIDConversation= this.messageList.get(i).getIDConversazione();
                
            }
            
        }
        
        return (maxIDConversation+1);
        
    }
    
    public void changeStatoByMsg(EMessaggio message){
        
        try {
            this.doc= this.builder.build(this.urlDoc);
        } catch (JDOMException ex) {
            Logger.getLogger(FMessaggi.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(FMessaggi.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        Element root= doc.getRootElement();
        List<Element> allMessages= root.getChildren();
        
        for(int i=0; i<allMessages.size(); i++){

            if(allMessages.get(i).getChild("id").getText().equals(String.valueOf(message.getID()))){
                
                Element currMessage= (Element) allMessages.get(i);
                currMessage.removeChild("stato");
                Element stato= new Element("stato");
                stato.setText("1");
                currMessage.addContent(stato);
                
                String des = new XMLOutputter().outputString(this.doc);
                
                try{
                
                    FileWriter fileWriter = new FileWriter(new File(this.urlDoc));
                    fileWriter.write(des);
                    fileWriter.close();
                    FUtility.printElementFromXML(outp, (Element)allMessages.get(i));
                    

                } catch (IOException ex) {
                    Logger.getLogger(FMessaggi.class.getName()).log(Level.SEVERE, null, ex);
                }
                
                
            }

        }
        
    }
    
}
